﻿using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;

namespace IssueVision.Data.Web
{
    public sealed class IssueVisionServiceConstant
    {
        public const byte HighestPriority = 1;
        public const byte LowestPriority = 4;
        public const byte HighestSeverity = 1;
        public const byte LowestSeverity = 4;
        public const byte OpenStatusID = 0;
        public const byte ActiveStatusID = 1;
        public const byte ResolvedStatusID = 3;
        public const string UserTypeAdmin = "Admin";
        public const string UserTypeUser = "User";
    }

    public static class UserRules
    {
        /// <summary>
        /// validate user email address
        /// </summary>
        /// <param name="email"></param>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public static ValidationResult IsValidEmail(string email, ValidationContext validationContext)
        {
            // user Email can be null
            if (email == null)
                return ValidationResult.Success;

            // Return true if strIn is in valid e-mail format.
            if (Regex.IsMatch(email,
                   @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" +
                   @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$"))
                return ValidationResult.Success;
            return new ValidationResult(ErrorResources.ValidationErrorInvalidEmail, new[] { "Email" });
        }
    }

    public static class IssueRules
    {
        /// <summary>
        /// When status is Resolved, the ResolutionID cannot be null or zero,
        /// and when the status is not Resolved, the ResolutionID should be
        /// either null or zero.
        /// </summary>
        /// <param name="issue"></param>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public static ValidationResult CheckStatusResolved(Issue issue, ValidationContext validationContext)
        {
            if (issue.StatusID == IssueVisionServiceConstant.ResolvedStatusID &&
                (issue.ResolutionID == null || issue.ResolutionID == 0))
                return new ValidationResult(ErrorResources.IssueResolutionIsRequired, new[] { "ResolutionID" });

            if (issue.StatusID != IssueVisionServiceConstant.ResolvedStatusID &&
                issue.ResolutionID != null && issue.ResolutionID != 0)
                return new ValidationResult(ErrorResources.IssueResolutionIsNotNeeded, new[] { "ResolutionID" });

            return ValidationResult.Success;
        }

        /// <summary>
        /// When status is Active, assigned-to-user cannot be null.
        /// </summary>
        /// <param name="issue"></param>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public static ValidationResult CheckStatusActive(Issue issue, ValidationContext validationContext)
        {
            if (issue.StatusID == IssueVisionServiceConstant.ActiveStatusID && issue.AssignedToID == null)
                return new ValidationResult(ErrorResources.AssignedToIDIsRequired, new[] { "AssignedToID" });

            return ValidationResult.Success;
        }

        /// <summary>
        /// When status is Open, assigned-to-user should be null.
        /// </summary>
        /// <param name="issue"></param>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public static ValidationResult CheckStatusOpen(Issue issue, ValidationContext validationContext)
        {
            if (issue.StatusID == IssueVisionServiceConstant.OpenStatusID && issue.AssignedToID != null)
                return new ValidationResult(ErrorResources.AssignedToIDIsNotNeeded, new[] { "AssignedToID" });

            return ValidationResult.Success;
        }
    }
}
